//输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。 
//
// 
//
// 示例 1： 
//
// 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
//输出：[1,2,3,6,9,8,7,4,5]
// 
//
// 示例 2： 
//
// 输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
//输出：[1,2,3,4,8,12,11,10,9,5,6,7]
// 
//
// 
//
// 限制： 
//
// 
// 0 <= matrix.length <= 100 
// 0 <= matrix[i].length <= 100 
// 
//
// 注意：本题与主站 54 题相同：https://leetcode-cn.com/problems/spiral-matrix/ 
//
// Related Topics 数组 矩阵 模拟 👍 469 👎 0


//leetcode submit region begin(Prohibit modification and deletion)

/**
 * new一个结果数组，长度为 matrix 元素个数
 * 控制边界，将 matrix 元素赋值给 结果数组
 *
 * 顺时针打印，控制边界条件如下：
 *  从左到右：列在变，横坐标始终为t，本行完成后上边界向下收缩
 *  从上到下：行在变，纵坐标始终为r，本列完成后右边界向左收缩
 *  从右到左：列在变，横坐标始终为b，本行完成后下边界向上收缩
 *  从右到左：行在变，纵坐标始终为l，本行完成后左边界向右收缩
 */
class Solution {
    public int[] spiralOrder(int[][] matrix) {

        int length = matrix.length * matrix[0].length;
        int[] res = new int[length];
        int index = 0;

        int l = 0, r = matrix[0].length-1, t = 0, b = matrix.length-1;

        while (true){
            //从左到右，列在变，横坐标始终为t，本行完成后上边界向下收缩
            for(int i = l; i <= r; i++) res[index++] = matrix[t][i];
            if(++t > b) break;

            //从上到下，行在变，纵坐标始终为r，本列完成后右边界向左收缩
            for(int i = t; i <= b; i++) res[index++] = matrix[i][r];
            if(l > --r) break;

            //从右到左，列在变，横坐标始终为b，本行完成后下边界向上收缩
            for(int i = r; i >= l; i--) res[index++] = matrix[b][i];
            if(t > --b) break;

            //从右到左，行在变，纵坐标始终为l，本行完成后左边界向右收缩
            for(int i = b; i >= t; i--) res[index++] = matrix[i][l];
            if(++l > r) break;

        }

        return res;
    }
}
//leetcode submit region end(Prohibit modification and deletion)
